﻿ #define _CRT_SECURE_NO_WARNINGS 1
//练习1：多个字符从两端移动，向中间汇聚,编写代码，演⽰多个字符从两端移动，向中间汇聚
//分析：0  1 2 3 4 5 
 //     *  * * * * *
//头尾字符配对，一对往下移动替换，接着在此替换基础上，再拿一对往下替换,循环起来

#include<stdio.h>
//#include<string.h>
//#include<windows.h>
//#include<stdlib.h>
int main()
{
	//	char a[] = { "ggg  hhh  iiio" };
	//	char b[] = { "**************" };
	//	int left = 0;
	//	int i = 0;
	//	char right = strlen(a) - 1;
	//	while (left <= right)
	//
	//	{
	//		b[left] = a[left];
	//		b[right] = a[right];


		/*	printf("%s",b);*///数组b是双引号引起来的字符串
			/*
			for (i=0; i <= right; i++)
			{

				printf("%c", b[i]);

			}*/   //注意，此种写法会漏掉字符

			/*	printf("\n");
				Sleep(10);
				system("cls");
				left++;
				right--;

			}
			printf("%s", b);*/
			//
			//char arr1[] = "welcome to bit...";
			//char arr2[] = "#################";
			//int left = 0;
			//int right = strlen(arr1) - 1;
			//printf("%s\n", arr2);
			//while (left <= right)
			//{
			//
			//	arr2[left] = arr1[left];
			//	arr2[right] = arr1[right];
			//	left++;
			//	right--;
			//	printf("%s\n", arr2);******************************
			//	Sleep(1000);
			//
			//
			//
			//}












				//在⼀个升序的数组中查找指定的数字n，很容易想到的⽅法就是遍历数组，但是这种⽅法效率⽐较低
				//二分查找




	int arr[] = { 1,2,3,4,5,6,7,8,9,10,11 };
	int num = 2;
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0] - 1);
	int flg = 0;

	while (left <= right)
	{
		int mid = (left + right) / 2;
		if (arr[mid] < num)
		{
			left = mid + 1;


		}


		else if (arr[mid] > num)
		{
			right = mid - 1;



		}
		else 
		{
			flg = 1;
			printf("找到了，数字是%d\n", arr[mid]);
			break;
		}
		
		//循环的逻辑错误，拿中间下标值和要找的数字比较是循环核心，要么相等，要么大于，要么就小于，除了这三种情况
		//程序不会进入第四种情况了，因为折半，相等已经是最坏或最好的结果(多次判断后才相等或一次就相等)
		//所以我之前写的第四种情况是错的，没有大于小于相等都没进去就走第四种的情况，
		// 前三种情况一定会进去，那么第四种情况就是根本无用的情
		

		}


	
if(flg == 0)
{
	printf("没找到\n");

}






	return 0;

}